// var $audioManager = require("./AudioManager");
// var i = (function () {
//     function e() {
//         this._btnNames = [];
//         this._buttons = [];
//         this._clickFastMap = new Map();
//         this._clickInterval = 500;
//         this._clickTimeMap = new Map();
//     }
//     e.prototype.addClickListener = function (e, t) {
//         var o = this;
//         this._callfunc = e;
//         this._target = t;
//         this._buttons = [];
//         this._btnNames.forEach(function (e) {
//             var t = o[e];
//             if (t && t instanceof cc.Button) {
//                 o._buttons.push(o[e]);
//             }
//         });
//         for (var n = 0; n < this._buttons.length; n++) {
//             var i = this._buttons[n];
//             if (i) {
//                 this._addClickListener(i);
//             }
//         }
//     };
//     e.prototype.setClickFast = function (e) {
//         if (this._buttons.includes(e)) {
//             this._clickFastMap.set(e, !0);
//         }
//     };
//     e.prototype._addClickListener = function (e) {
//         var t = e.node;
//         t.targetOff(this);
//         t.on("click", this._clickListener, this);
//         t.on(
//             cc.Node.EventType.TOUCH_START,
//             function () {
//                 $audioManager.AudioMgr.playEffect("effect/button");
//             },
//             this
//         );
//     };
//     e.prototype._clickListener = function (e) {
//         var t = this._clickTimeMap.get(e);
//         var o = new Date().getTime();
//         var n = 0;
//         if (!this._clickFastMap.has(e)) {
//             n = this._clickInterval;
//         }
//         if (!t || o - t >= n) {
//             this._clickTimeMap.set(e, o);
//             this._callfunc.apply(this._target, [e]);
//         }
//     };
//     return e;
// })();
// exports.default = i;

// import { AudioMgr } from "./AudioManager";

// /**
//  * 建议类名: ButtonClickManager
//  */
// class UIBindings {
//     protected _btnNames: string[];
//     private _buttons: cc.Button[];
//     private _clickFastMap: Map<cc.Button, boolean>;
//     private _clickInterval: number;
//     private _clickTimeMap: Map<cc.Button, number>;
//     private _callfunc: Function;
//     private _target: any;

//     constructor() {
//         this._btnNames = [];
//         this._buttons = [];
//         this._clickFastMap = new Map();
//         this._clickInterval = 500;
//         this._clickTimeMap = new Map();
//     }

//     /**
//      * 添加点击监听器
//      * @param e 回调函数
//      * @param t 回调函数的目标
//      * 建议方法名: addClickListener
//      */
//     public addClickListener(e: Function, t: any): void {
//         this._callfunc = e;
//         this._target = t;
//         this._buttons = [];
//         this._btnNames.forEach((btnName) => {
//             const button = this[btnName] as cc.Button;
//             if (button && button instanceof cc.Button) {
//                 this._buttons.push(button);
//             }
//         });
//         for (let n = 0; n < this._buttons.length; n++) {
//             const button = this._buttons[n];
//             if (button) {
//                 this._addClickListener(button);
//             }
//         }
//     }

//     /**
//      * 设置按钮快速点击
//      * @param e 需要设置的按钮
//      * 建议方法名: setClickFast
//      */
//     public setClickFast(e: cc.Button): void {
//         if (this._buttons.includes(e)) {
//             this._clickFastMap.set(e, true);
//         }
//     }

//     /**
//      * 添加点击监听器到按钮
//      * @param e 需要添加监听器的按钮
//      * 建议方法名: _addClickListener
//      */
//     protected _addClickListener(e: cc.Button): void {
//         const t = e.node;
//         t.targetOff(this);
//         t.on("click", this._clickListener, this);
//         t.on(
//             cc.Node.EventType.TOUCH_START,
//             () => {
//                 AudioMgr.playEffect("effect/button");
//             },
//             this
//         );
//     }

//     /**
//      * 点击监听器
//      * @param button 点击事件
//      * 建议方法名: _clickListener
//      */
//     protected _clickListener(button: cc.Button): void {
//         // const button = e.target.getComponent(cc.Button);
//         // if (!button) return;

//         const t = this._clickTimeMap.get(button);
//         const o = new Date().getTime();
//         let n = 0;
//         if (!this._clickFastMap.has(button)) {
//             n = this._clickInterval;
//         }
//         if (!t || o - t >= n) {
//             this._clickTimeMap.set(button, o);
//             this._callfunc.apply(this._target, [button]);
//         }
//     }
// }

// export default UIBindings;

import { AudioMgr } from "./AudioManager";

/**
 * 建议类名: ButtonClickManager
 */
class UIBindings {
    protected _btnNames: string[];
    private _buttons: cc.Button[];
    private _clickFastMap: Map<cc.Button, boolean>;
    private _clickInterval: number;
    private _clickTimeMap: Map<cc.Button, number>;
    private _callfunc: Function;
    private _target: any;

    constructor() {
        this._btnNames = [];
        this._buttons = [];
        this._clickFastMap = new Map();
        this._clickInterval = 500;
        this._clickTimeMap = new Map();
    }

    /**
     * 添加点击监听器
     * @param callback 回调函数
     * @param context 回调函数的目标
     * 建议方法名: addClickListener
     */
    public addClickListener(callback: Function, context: any): void {
        this._callfunc = callback;
        this._target = context;
        this._buttons = [];
        this._btnNames.forEach((btnKey: string) => {
            const button = this[btnKey] as cc.Button;
            if (button && button instanceof cc.Button) {
                this._buttons.push(button);
            }
        });
        for (let button of this._buttons) {
            if (button) {
                this._addClickListener(button);
            }
        }
    }

    /**
     * 设置按钮快速点击
     * @param button 需要设置的按钮
     * 建议方法名: setClickFast
     */
    public setClickFast(button: cc.Button): void {
        if (this._buttons.includes(button)) {
            this._clickFastMap.set(button, true);
        }
    }

    /**
     * 添加点击监听器到按钮
     * @param button 需要添加监听器的按钮
     * 建议方法名: _addClickListener
     */
    protected _addClickListener(button: cc.Button): void {
        const node = button.node;
        node.targetOff(this);
        node.on("click", this._clickListener, this);
        node.on(
            cc.Node.EventType.TOUCH_START,
            () => {
                AudioMgr.playSoundEffect("effect/button");
            },
            this
        );
    }

    /**
     * 点击监听器
     * @param button 点击事件
     * 建议方法名: _clickListener
     */
    protected _clickListener(button: cc.Button): void {
        const lastClickTime = this._clickTimeMap.get(button);
        const currentTime = new Date().getTime();
        let interval = 0;
        if (!this._clickFastMap.has(button)) {
            interval = this._clickInterval;
        }
        if (!lastClickTime || currentTime - lastClickTime >= interval) {
            this._clickTimeMap.set(button, currentTime);
            this._callfunc.apply(this._target, [button]);
        }
    }
}

export default UIBindings;